﻿using System;
using System.Text.RegularExpressions;

namespace Validate.Net.Core
{
    /// <summary>
    /// 表示自定义正则校验特性的基类。
    /// <para>如果要让特性可以自定义内联提示语，则实现构造方法，并把参数 <see langword="internalPrompts"/> 传递给 <see cref="ValidateRegexBaseAttribute(string)"/></para>
    /// <para>提示语优先级: <see cref="InternalPrompts"/> > <see cref="CustomPrompts.Set{T}(string)"/> > <see cref="Prompts"/></para>
    /// </summary>
    public abstract class ValidateRegexBaseAttribute : ValidateBaseAttribute
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="internalPrompts">内联提示语</param>
        public ValidateRegexBaseAttribute(string internalPrompts) : base(internalPrompts)
        {

        }

        /// <summary>
        /// 要匹配的正则表达式模式。
        /// </summary>
        public virtual string Pattern { get; protected set; }

        /// <summary>
        /// 默认实现的正则校验方法。
        /// </summary>
        /// <param name="value">属性值</param>
        /// <returns><see langword="true"/>: 校验完成，<see langword="false"/>: 校验失败</returns>
        public override bool OnCheck(object value)
        {
            if (value is string str)
            {
                return Regex.IsMatch(str, Pattern);
            }
            else
            { throw new ArgumentException($"特性 {nameof(ValidateRegexBaseAttribute)} 只能修饰 {nameof(String)} 类型的属性"); }
        }
    }
}
